package Game.Core;

import Game.Core.Match;

import java.io.File;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.nio.channels.FileChannel;

/**
 * Created by michaelfrandin on 15/05/14.
 */
public class Season {

    private String dirStart = "Archives/Start/";

    private String dirPlay = "Archives/Play/";

    private String dirLocalAplication;

    public void init()
    {
        this.dirLocalAplication = System.getProperty("user.dir") + "/src/";

        ArrayList<String> listMatchs = this.checkSeason();
        if ( listMatchs.size() > 0 ) {
            long tempoInicial = System.currentTimeMillis();
            this.transferMatch(
                    listMatchs,
                    this.dirLocalAplication + this.dirStart,
                    this.dirLocalAplication + this.dirPlay
            );

            /**
             * Inicia a partida
             */
            (new Match(
                    listMatchs,
                    this.dirLocalAplication + this.dirPlay)
            ).start();

            long tempoFinal = System.currentTimeMillis();
            System.out.println( "Tempo em millis: " + (float) (tempoFinal - tempoInicial)/1000 );
        }
    }

    /**
     * Move arquivos
     * @param list ArrayList Arquivos que devem ser movidos de pasta
     * @param from String Local de origem do arquivo
     * @param to String Local de destino do arquivo
     */
    private void transferMatch(ArrayList<String> list, String from, String to)
    {
        try {
            for(int i=0; i < list.size(); i++){
                copy(new File(from + list.get(i)), new File(to + list.get(i)), true);
            }
        }
        catch (IOException e) {

        }
    }

    /**
     * Retorna todos os arquivos de partida disponiveis.
     * @return ArrayList<String>
     */
    private ArrayList<String> checkSeason()
    {
        ArrayList<String> listMatchs = new ArrayList();
        File file = new File(this.dirLocalAplication + this.dirStart);

        if(file.listFiles().length > 0) {
            for (File f: file.listFiles()) {
                listMatchs.add(f.getName());
            }
        }

        return listMatchs;
    }

    /**
     * Copia arquivos de um local para o outro
     * @param from - Arquivo de origem
     * @param to - Arquivo de destino
     * @param overwrite - Confirmação para sobrescrever os arquivos
     * @throws IOException
     */
    public static void copy(File from, File to, boolean overwrite) throws IOException {
        if (from.exists() && !overwrite){
            System.err.println(from.getName()+" já existe, ignorando...");
            return;
        }
        FileInputStream fisOrigem = new FileInputStream(from);
        FileOutputStream fisDestino = new FileOutputStream(to);
        FileChannel fcOrigem = fisOrigem.getChannel();
        FileChannel fcDestino = fisDestino.getChannel();
        fcOrigem.transferTo(0, fcOrigem.size(), fcDestino);
        fisOrigem.close();
        fisDestino.close();
    }
}
